package com.fxu.framework.core.sql;

import com.fxu.framework.core.util.FieldUtil;
import lombok.Getter;
import lombok.ToString;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;

/**
 * 级联查询、更新集合类（依靠Entity中单@Cascade级联查询、更新）
 *
 * @author 方旭
 * @version 1.0.0
 */
@Getter
@ToString
public class SCascade<SE extends SEntity<?>> implements SOrder<SCascade<SE>, SE> {

    /**
     * 实体类的类
     */
    protected Class<SE> clazz;

    /**
     * 显示字段集合
     */
    protected List<SField<?>> showFields = new ArrayList<>();

    /**
     * 排序字段 order by XXX asc/desc 集合
     */
    protected List<SValue> orderByFields = new ArrayList<>();

    /**
     * 创建SCascade对象
     * @param <SE> SEntity对象类型
     * @param clazz SEntity类型对象
     * @return SCascade 对象
     */
    public static <SE extends SEntity<?>> SCascade<SE> build(Class<SE> clazz) {
        return new SCascade<>(clazz);
    }

    /**
     * 构造方法,设置实体类
     * @param clazz 实体类
     */
    public SCascade(Class<SE> clazz) {
        this.clazz = clazz;
    }

    /**
     * 构造方法,设置实体类
     */
    public SCascade() {
        Type type = getClass().getGenericSuperclass();
        if (type instanceof ParameterizedType) {
            this.clazz = (Class<SE>) ((ParameterizedType) type).getActualTypeArguments()[0];
        } else {
            throw new RuntimeException("初始化错误!要么new SXxx<T>(){}，要么new SXxx<>(Class)");
        }
    }

    /**
     * 设置读取显示字段
     * @param sFunc 显示字段集合
     * @return 本类对象
     */
    @SafeVarargs
    public final SCascade<SE> show(SFunc<SE, ?>... sFunc) {
        if (sFunc != null) {
            for (SFunc<SE, ?> field : sFunc) {
                getShowFields().add(new SField<>(getClazz(), field));
            }
        }
        return this;
    }
}
